package handler

import (
	"context"
	"fmt"
	"protobuf/pb"
	// 注意此处要用 v2 否则报错
	// grpc 时改用 google的 proto "github.com/golang/protobuf/proto"
)

// TODO 取 server
type Future struct {
	// pb.UnimplementedFutureServer
	pb.FutureHandler
}

func (h *Future) GetMinBar(ctx context.Context, in *pb.BarRequest, out *pb.BarResponse) error {
	out.Instrument = fmt.Sprintf("%s.%d", "rb2205", in.Mins)
	return nil
}

// // TODO 挂载(overwrite)方法, 具体方法参考 UnimplementedMinServiceServer
// func (s *Future) GetMinBar(ctx context.Context, req *pb.BarRequest) (*pb.BarResponse, error) {
// 	bs, _ := proto.Marshal(req)
// 	fmt.Println("req:", string(bs))
// 	rsp := &pb.BarResponse{
// 		Instrument: req.GetInstrument(),
// 	}
// 	return rsp, nil
// }

// func (s *Future) GetMinBarStreamIn(in pb.Future_GetMinBarStreamInServer) error {
// 	return nil // status.Errorf(codes.Unimplemented, "method GetMinBarStreamIn not implemented")
// }
// func (s *Future) GetMinBarStreamOut(req *pb.BarRequest, out pb.Future_GetMinBarStreamOutServer) error {
// 	return nil //status.Errorf(codes.Unimplemented, "method GetMinBarStreamOut not implemented")
// }

// // 流式处理
// func (s *Future) GetMinBarStreamInOut(min pb.Future_GetMinBarStreamInOutServer) error {
// 	// 用 pb.BarRequest (非指针) 时有以下警告
// 	// variable declaration copies lock value to req: protobuf/pb.BarRequest contains google.golang.org/protobuf/internal/impl.MessageState contains sync.Mutex
// 	var chReq = make(chan *pb.BarRequest)
// 	go func() {
// 		for {
// 			req, err := min.Recv()
// 			if err != nil {
// 				//return errors.Wrap(err, "recv")
// 				chReq <- &pb.BarRequest{} // 遇错退出
// 				return
// 			}
// 			chReq <- req
// 		}
// 	}()
// 	for {
// 		var req = <-chReq
// 		if req.Instrument == "" { // 退出
// 			break
// 		}
// 		resp := &pb.BarResponse{
// 			Instrument: req.Instrument,
// 		}
// 		min.Send(resp)
// 	}
// 	return nil
// }
